延續昨天介紹寫簡單 Java Thread Example 的部份,今天使用實作 Runnable interface 的方式,來開 Java 多執行緒的程式,sample code 如下:
public class ThreadExample2 implements Runnable {
private String message;
public ThreadExample2(String message){
this.message = message;
}
@Override
public void run() {
System.out.println("Thread message is:" + this.message);
}
}
上面的程式主要是 implement Runnable 的 class,並且實作了 run method,用來印出建構子傳入的 message,以下的程式就來啟動上面所實作的 Thread 程式。
public class Test {
public static void main(String args[]) {
Thread thread1 = new Thread(new ThreadExample2("message1"));
Thread thread2 = new Thread(new ThreadExample2("message2"));
Thread thread3 = new Thread(new ThreadExample2("message3"));
Thread thread4 = new Thread(new ThreadExample2("message4"));
Thread thread5 = new Thread(new ThreadExample2("message5"));
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}
上面的 main 主程式裡,啟動多執行緒的方式與昨天繼承 Thread class 方式一樣都是呼叫 start 方法,不一樣的地方在於實作 Runnable interface是把實作的 class 傳入到 Thread 的建構子裡去,而不是真接 new 出 Runnable 的實作再呼叫 start 方法。
以上的程式輸出的結果如下:
Thread message is:message1
Thread message is:message2
Thread message is:message3
Thread message is:message5
Thread message is:message4
我們會發現輸出的結果不會按照順序從 message1 到 message5有序的輸出,而且每次執行的結果都有可能會不一樣。
簡單的整理一下使用繼承 Thread class的方式和實作 Runnable interface 的方式來撰寫 Java 多執行緒的主要差別如下:
1.使用繼承 Thread 的方式來實作的話之話就不能繼承其它的 class,但是使用實作 Runnable 的方式之後還是可以實作其它 Interface 或是繼承其它有需要的 class
2.使用繼承 Thread 的方式直接 new Thread 繼承的 class 就可以 start,但是使用實作 Runnable 的方式需要再 new 一個 Thread 的 class,再把實作的 Runnable 傳入 Thread 的建構子裡面,才能呼叫 start 方法。
3.在使用共享資源方面使用 Runnable 的 interface 較為方便
另外如果我們要把正在執行的執行緒暫停,可以使用 Thread.sleep(毫秒數) 的方式,程式如下:
public class ThreadExample2 implements Runnable {
private String message;
public ThreadExample2(String message){
this.message = message;
}
@Override
public void run() {
try {
Thread.sleep(5000L);
System.out.println("Thread message is:" + this.message);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
以上的程式在執行 Thread 的時侯會先暫停 5 秒的時間,之後在執行輸出 message 到 console 上。